#include<cppr.hpp>
using namespace std;
/*
比虚函数更纯粹，它没有函数体，完全是为了被子类覆盖而存在。
拥有纯虚函数的类叫做抽象类，抽象类不能被实例化，
如果子类不把父类中的纯虚函数实现，子类也是抽象类。
*/
class Animal // 如果不加virtual，则调用的是父类的函数
{
public:
    virtual void speak()  = 0; // 纯虚函数
   
    virtual void run() = 0; // 纯虚函数
    
    virtual void eat()  = 0;// 纯虚函数
    
    virtual void sleep() = 0; // 纯虚函数
   
};
class Dog : public Animal
{
public:
    void speak()
    {
        cout << "dog speak" << endl;
    }
    void run()
    {
        cout << "dog run" << endl;
    }
    void eat()
    {
        cout << "dog eat" << endl;
    }
    void sleep()
    {
        cout << "dog sleep" << endl;
    }
};
class Cat : public Animal
{
public:
    void speak()
    {
        cout << "cat speak" << endl;
    }
    void run()
    {
        cout << "cat run" << endl;
    }
    void eat()
    {
        cout << "cat eat" << endl;
    }
    void sleep()
    {
        cout << "cat sleep" << endl;
    }
};

int main()
{
    Animal *animal; // 父类指针
    cout << "请输入要创建的动物类型:1.狗 2.猫" << endl;
    int a = 0;
    cin >> a;
    if (a == 1)
    {
        animal = new Dog; // 父类指针指向子类对象,实现多态.如果不加virtual，则调用的是父类的函数
    }
    else if (a == 2)
    {
        animal = new Cat;
    }
    animal->speak();
    animal->run();
    animal->eat();
    animal->sleep();
    delete animal;
    return 0;
}